/**
 *  EasyExcel 的ReadListener是用于处理Excel文件主行读取的核心组件，适合在内存敏感或大文件场景下使用，通过实现ReadListener接口，用户可以自定义每行数据的处理逻辑，并实现批量处理，错误处理等功能
 *  核心方法：
 *      invoke: 每读一行数据时触发。
 *          参数： data：当前行的解析结果，类型是自己定义的Java类
 *                context：解析上下文，包含一些游泳的信息（当前行号，Sheet等信息）
 *      doAfterAllAnalysed：文件所有数据读取完成后触发
 *          参数：
 *              context：解析上下文
 *
 *  EasyExcel 的 ReadListener 是通过事件驱动的机制处理Excel异步读取的，单看起来它是同步返回的，其实EasyExcel在读取文件时会分批次读取数据，这使得它在内部实现了异步读取，而对用户来说，整个读取过程是同步的
 *  如何实现这一行为的：
 *      1. 如何进行异步读取：EasyExcel 在读取文件时，通常使用多线程并行处理数据读取，具体的处理流程如下：
 *          - 异步读取数据：EasyExcel会启动多个线程来并行读取Excel文件的数据块，这些线程底层读取数据，病将数据传递到相应的ReadListener
 *          - 事件驱动机制：ReadListener监听到Excel文件的读取事件，当一批数据读取完成时，ReadListener会收到事件通知，它可以在事件中处理数据，（例如：批量存储，输出到数据库等）
 *      2. 为什么看起来时同步的： 虽然EasyExcel后台实现了并行处理，但最终返回给调用者的行为时同步的，这是因为
 *          - 批量处理和会调机制：在读取数据的过程中，EasyExcel会将读取的结果传给ReadListener中的invoke方法，这个方法中，开发者可以对每一批数据进行处理
 *          - 调用的同步接口：EasyExcel提供了 doReadSync 或 read 等同步方法来启动文件的读取，调用这些方法，他们会等待数据完全读取并返回，而不会立刻返回。即使数据是通过异步读取的，最终会等待所有数据读取完成。
 *      3. 实现原理
 *          - 启动读取任务：当调用 EasyExcel.read(file).sheet().doReadSync()时，EasyExcel会启动多个线程，分批读取EasyExcel的数据
 *          - 数据传递给监听器: 每读取一批数据会传递给ReadListener中的invoke方法，将数据传递给开发者，这个过程是异步的。EasyExcel使用线程池来处理文件读取
 *          - 同步等待的结果：尽管文件时异步读取的，但是doReadSync会同步等待数据读取的完成。他会在所有的数据被读取并传递到监听器才返回，确保数据处理完成后才会返回调用方法。
 *      4. 异步读取的优势
 *          - 提高效率：通过多线程并行读取文件，EasyExcel可以大大提高读取文件的效率，尤其文件内容比较多时
 *          - 内存优化：通过分批读取数据，避免一次行加载所有数据到内存，从而有效减少内存的使用。
 */
package com.medical.excel;